# -*- coding: utf-8 -*-

import re
import math
from exceptions import StandardError
from django.core.exceptions import ValidationError

class Result:

    def __init__(self, home_result, away_result):
        """
        Konstruktor rezultata. Obavlja sve provere i baca StandardError ako ima greske u logici rezultat
        """
        self.home_result = home_result
        self.away_result = away_result
        if home_result>away_result:
            self.winner = 1
        elif home_result == away_result:
            self.winner = 2
        else:
            self.winner = 3

    def is_valid(self, game_type):
        if game_type == 1:
            if self.home_result + self.away_result > 1:
                raise ValidationError('Šahovski rezultat mora biti 0:0, 1:0 ili 0:1')
        if game_type == 2:
            diff = math.fabs(self.home_result - self.away_result)
            if diff == 0:
                raise ValidationError('Rezultat stonog fudbala ne može biti nerešeno')
            if diff == 1 or diff > 2:
                if (self.home_result != 5) and (self.away_result != 5):
                    raise ValidationError('Rezultat stonog fudbala mora biti na dva razlike')
        if game_type == 4:
            diff = math.fabs(self.home_result - self.away_result)
            if diff == 0:
                raise ValidationError('Rezultat basketa ne može biti nerešeno')
            if diff == 1:
                raise ValidationError('Rezultat basketa ne može biti sa samo jednim poenom razlike')
            if diff > 2:
                if (self.home_result != 11) and (self.home_result != 21) and (self.away_result != 11) and (self.away_result != 21):
                    raise ValidationError('Rezultat basketa mora biti do 11 ili do 21 ili na dva razlike')
            else: # diff == 2
                if (self.home_result < 9) and (self.away_result < 9):
                    raise ValidationError('Rezultat basketa mora biti do najmanje 11')

    def get_winner(self):
        return self.winner

    def __unicode__(self):
        return "%i:%i" % (self.home_result, self.away_result)
    
    @staticmethod
    def parse_result(value):
        """
        Factory metoda za parsiranje rezultata iz stringa. Vraca objekat rezultata ili baca StandardError
        """
        # regularni izraz kojim vadimo uneti rezultat
        p=re.compile('^(?P<home>\d+):(?P<away>\d+)$')
        m = p.match(value)
        if m == None:
            raise StandardError('Format rezultata neispravan')
        home, away = int(m.group('home')), int(m.group('away'))
        return Result(home, away)